using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace AgilePlannerDT.Data
{
    /// <summary>
    /// Defines a project planning object
    /// </summary>
    public interface Project : AbstractRoot, IXmlSerializable
    {
        /// <summary>
        /// Adds the iteration.
        /// </summary>
        /// <param name="iteration">The iteration.</param>
        void AddIteration(Iteration iteration);

        /// <summary>
        /// Gets or sets the backlog.
        /// </summary>
        /// <value>The backlog.</value>
        Backlog Backlog
        {
            get;
            set;
        }

        /// <summary>
        /// Gets or sets the iteration children.
        /// </summary>
        /// <value>The iteration children.</value>
        List<Iteration> IterationChildren
        {
            get;
            set;
        }

        List<TeamMember> TeamMemberChildren
        {
            get;
            set;
        }

        void AddTeamMember(TeamMember teamMember);

        void RemoveTeamMember(TeamMember teamMember);

        /// <summary>
        /// Gets or sets the legend.
        /// </summary>
        /// <value>The legend.</value>
        /// 
        Legend Legend
        {
            get;
            set;
        }

        /// <summary>
        /// Removes the iteration.
        /// </summary>
        /// <param name="iteration">The iteration.</param>
        void RemoveIteration(Iteration iteration);

        /// <summary>
        /// Undeletes an index card.
        /// </summary>
        /// <param name="indexCard">The index card.</param>
        /// <returns></returns>
        IndexCard UndeleteCard(IndexCard indexCard);

        /// <summary>
        /// Moves the story card to new parent.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="oldparentid">The ID of the former parent.</param>
        /// <param name="newparentid">The ID of the new parent.</param>
        /// <param name="locationX">The location X.</param>
        /// <param name="locationY">The location Y.</param>
        /// <param name="rotationAngle">The rotation angle.</param>
        /// <returns></returns>
        StoryCard MoveStoryCardToNewParent(long id, long oldparentid, long newparentid, double locationX, double locationY, double rotationAngle);

        /// <summary>
        /// Deletes a card.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns></returns>
        IndexCard DeleteCard(long id);

        /// <summary>
        /// Creates the story card.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="description">The description.</param>
        /// <param name="width">The width.</param>
        /// <param name="height">The height.</param>
        /// <param name="locationX">The location X.</param>
        /// <param name="locationY">The location Y.</param>
        /// <param name="parentid">The parentid.</param>
        /// <param name="bestCaseEstimate">The best case estimate.</param>
        /// <param name="mostlikelyEstimate">The mostlikely estimate.</param>
        /// <param name="worstCaseEstimate">The worst case estimate.</param>
        /// <param name="actualEffort">The actual effort.</param>
        /// <param name="status">The status.</param>
        /// <param name="color">The color.</param>
        /// <param name="cardOwner">The card owner.</param>
        /// <param name="rotationAngle">The rotation angle.</param>
        /// <returns></returns>
        StoryCard CreateStoryCard(string name, string description, double width, double height, double locationX, double locationY, long parentid,
                float bestCaseEstimate, float mostlikelyEstimate, float worstCaseEstimate, float actualEffort, string status, string color, String cardOwner, float rotationAngle,string rallyID, string fitID);

        /// <summary>
        /// Creates the story card.
        /// </summary>
        /// <param name="storycard">The storycard.</param>
        /// <returns></returns>
        StoryCard CreateStoryCard(StoryCard storycard);

        /// <summary>
        /// Creates the iteration.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="description">The description.</param>
        /// <param name="width">The width.</param>
        /// <param name="height">The height.</param>
        /// <param name="locationX">The location X.</param>
        /// <param name="locationY">The location Y.</param>
        /// <param name="availableEffort">The available effort.</param>
        /// <param name="startDate">The start date.</param>
        /// <param name="endDate">The end date.</param>
        /// <returns></returns>
        Iteration CreateIteration(string name, string description, double width, double height, double locationX, double locationY, float availableEffort,
                DateTime startDate, DateTime endDate);

        /// <summary>
        /// Creates the iteration.
        /// </summary>
        /// <param name="iteration">The iteration.</param>
        /// <returns></returns>
        Iteration CreateIteration(Iteration iteration);

        /// <summary>
        /// Creates the backlog.
        /// </summary>
        /// <param name="width">The width.</param>
        /// <param name="height">The height.</param>
        /// <param name="locationX">The location X.</param>
        /// <param name="locationY">The location Y.</param>
        /// <returns></returns>
        Backlog CreateBacklog(double width, double height, double locationX, double locationY);

        /// <summary>
        /// Creates the backlog.
        /// </summary>
        /// <param name="backlog">The backlog.</param>
        /// <returns></returns>
        Backlog CreateBacklog(Backlog backlog);

        /// <summary>
        /// Updates the card.
        /// </summary>
        /// <param name="indexCard">The index card.</param>
        /// <returns></returns>
        IndexCard UpdateCard(IndexCard indexCard);

        /// <summary>
        /// Finds the card.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns></returns>
        IndexCard FindCard(long id);

        /// <summary>
        /// Updates the legend.
        /// </summary>
        /// <param name="legend">The legend.</param>
        /// <returns></returns>
        Legend UpdateLegend(Legend legend);

  



     
    }
}